(defvar *operadores* '(llenar4 vaciar4 llenar3 vaciar3 llenar4con3 llenar3con4 vaciar3en4 vaciar4en3))

(defstruct jarras 4l 3l)

(defparameter *estado-inicial* (make-jarras :4l 0 
                                            :3l 0))

(defun es-estado-final (estado)
  (= 2 (jarras-4l estado)))

(defun llenar4 (estado)
  (when (< (jarras-4l estado) 4)
  (make-jarras :4l 4 
               :3l (jarras-3l estado))))

(defun vaciar4 (estado)
(when (> (jarras-4l estado) 0)
(make-jarras :4l 0
             :3l (jarras-3l estado))))

(defun llenar3 (estado)
(when (< (jarras-3l estado) 3)
  (make-jarras :3l 3 
               :4l (jarras-4l estado))))

(defun vaciar3 (estado)
(when (> (jarras-3l estado) 0)
(make-jarras :3l 0
             :4l (jarras-4l estado))))

(defun llenar4con3 (estado)
(let ((x (jarras-4l estado))
      (y (jarras-3l estado)))
(when (and (< x 4)
           (>= (+ x y) 4))
(make-jarras :4l 4
             :3l (- y (- 4 x))))))

(defun llenar3con4 (estado)
  (let ((x (jarras-4l estado))
        (y (jarras-3l estado)))
    (when (and (< y 3)
               (>= (+ x y) 3))
      (make-jarras :4l (- y (- 3 x))
                   :3l 3))))

(defun vaciar3en4 (estado)
  (let ((y (jarras-3l estado))
        (x (jarras-4l estado)))
    (when (and (> y 0)
               (<= (+ x y) 4))
      (make-jarras :4l (+ x y)
                   :3l 0))))

(defun vaciar4en3 (estado)
  (let ((y (jarras-3l estado))
        (x (jarras-4l estado)))
    (when (and (> x 0)
               (<= (+ x y) 3))
      (make-jarras :4l 0
                   :3l (+ x y)))))